package com.kaifamiao.inherit;

// 通过 extends 显式指定直接父类为 Base类
public class Sub extends Base {

    static {
        System.out.println( "Sub:StaticInitializer");
    }

    {
        System.out.println( "Sub: InstanceInitializer A" );
    }

    public Sub(){
        // 调用父类 Base 的 无参构造
        super();
        System.out.println( "Sub()" );
    }

    // 含有 "public static void main(String[])" 方法的类被称作 启动类
    // 直接运行 启动类 的 main 方法会导致该类被初始化
    // 当 子类被初始化时会先初始化其父类
    public static void main(String[] args) {
        // 这里会会看到 先执行父类的 类初始化器，再执行当前类的类初始化器
        System.out.println( "- ".repeat( 15 ) );

        // 构造的调用过程: Sub() ==> Base() ==> Object()
        // 构造的执行过程: Object() --> Base() --> Sub()
        Sub s = new Sub();
        System.out.println( s );

        System.out.println( "- ".repeat( 15 ) );

        Sub b = new Sub();
        System.out.println( b );
    }

    {
        System.out.println( "Sub: InstanceInitializer B" );
    }
}
